import { onMounted, type Ref, ref, reactive, toRaw, watch,toRefs } from 'vue'
import type { TableModel } from '../interface'

export const useTable = (props: any) => {
	// 表格数据
	const tableData: Ref<Array<any>> = ref([])
	// 分页数据
	const pageable = reactive<TableModel.Pageable>({
		pageNo: 1,
		pageSize: 5,
		total: 0
	})
	// 搜索过滤字段，根据search
	const searchColumns = ref<TableModel.ColumnProps>(props.columns.filter((item: any) => item.search))
	// 定义表单动态model
	let searchModel = reactive<{
		[propName: string]: any
	}>({})

	// 过滤model
	searchColumns.value.forEach(
		(element: TableModel.ColumnProps) => (searchModel[element.search.key ? element.search.key : element.prop] = '')
	)
	// 存在搜索条件显示
	const isSearchForm = ref<boolean>(toRaw(searchColumns.value).length > 0)

	/**
	 * 表格数据获取方法
	 *   注: 返回数据必须符合 特定格式: 格式不同调用dataCallback方法过滤
	 *     {
	 *        resultCode:1,
	 *        resultInfo:{
	 *            total:100, //总记录数
	 *            list:[] //列表数据
	 *        }
	 *     }
	 *
	 */
	const getTableData = async () => {
		// 如果数据格式不同,使用dataCallback方法过滤返回数据
		props.propCallback && (props.propCallback(searchModel))
		// 合并: 初始参数，分页参数, 搜索表单参数
		const res = await props.requestApi({ ...props.initParam, ...pageable, ...searchModel })
		let { resultCode, resultInfo } = res
		// 如果数据格式不同,使用dataCallback方法过滤返回数据
		props.dataCallback && (resultInfo = props.dataCallback(resultInfo))
		// 处理数据
		if (resultCode === 1) {
			tableData.value = resultInfo.list
			pageable.total = resultInfo.total
		} else {
			console.error(resultInfo)
		}
	}
	/**
	 * 页大小改变事件
	 */
	const bindSizeChange = (pageSize: number) => {
		pageable.pageSize = pageSize
		getTableData()
	}
	/**
	 * 页号改变事件
	 */
	const bindCurrentChange = (pageNo: number) => {
		pageable.pageNo = pageNo
		getTableData()
	}
	/**
	 * 搜索表单提交
	 */
	const onSearchSubmit = () => {
		pageable.pageNo = 1
		getTableData()
	}
	/**
	 * 刷新
	 */
	const onRefresh = () => {
		getTableData()
	}

	// 监听页面 initParam，重新刷新表格数据
	watch(() => props.initParam, getTableData, { deep: true })

	onMounted(() => getTableData())

	return {
		pageable,
		tableData,
		searchColumns,
		searchModel,
		isSearchForm,
		bindSizeChange,
		bindCurrentChange,
		onSearchSubmit,
		onRefresh,
		getTableData
	}
}
